package study.java.thread03;

/**
* @Name: SellTicketRunnable
* @Description: 多线程练习（实现Runnable接口）
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-8 下午10:07:39 
* @Version: V1.0
 */
public class SellTicketRunnable02 implements Runnable {
	
	//创建100张票
	private int tickets = 100 ;
	
	//创建锁对象
	private Object obj = new Object() ;

	@Override
	public void run() {
		while(true) {
			//创建同步代码块，把多条语句操作共享数据的代码包成一个整体，保证共享代码操作的原子性。
			//t1,t2,t3都能走到这
			//假设t1抢到了cpu的执行权，t1执行同步代码块
			//假设t2抢到了cpu的执行权，t2执行同步代码块，发现门锁着，等待t1执行完之后，门开，t2执行同步代码块，锁门
			//假设t3抢到了cpu的执行权，t3执行同步代码块，发现门锁着，等待t2执行完之后，门开，t3执行同步代码块，锁门，t3执行完同步代码块，开门，t1，t2，t3 ... ...
			//门(开，关)
			synchronized (obj) { //t1进来后，锁门
				if(tickets > 0) {
					System.out.println(Thread.currentThread().getName() + "正在出售第[" + (tickets--) + "]张票");
					try {
						//每卖一张票，休眠0.1秒
						Thread.sleep(100) ; //t1睡眠
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

}
